From 4b6e124d8b5a0dfd21aedf21d2c347fc5f0705a2 Mon Sep 17 00:00:00 2001
From: "Tzvetomir Stoyanov (VMware)" <tz.stoyanov@gmail.com>
Date: Thu, 12 Nov 2020 13:52:08 +0200
Subject: [PATCH] trace-cmd: libtracecmd API cleanup

The tracecmd library is used by trace-cmd and KernelShark applications.
All APIs, that are not used by KernelShark are removed from trace-cmd.h.
This is the first step to cleanup the library APIs and dependencies.

Link: https://lore.kernel.org/linux-trace-devel/20201112115208.1250789-3-tz.stoyanov@gmail.com

Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
[Retrieved from:
https://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git/commit/?id=4b6e124d8b5a0dfd21aedf21d2c347fc5f0705a2]
Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
---
 Makefile                                      |   2 +-
 include/trace-cmd/trace-cmd.h                 | 488 +-----------------
 include/trace-cmd/trace-filter-hash.h         |  64 ---
 include/trace-cmd/trace-hash.h                |  55 --
 include/trace-cmd/trace-msg.h                 |  15 -
 .../include/private/trace-cmd-private.h       | 480 +++++++++++++++++
 .../include/private/trace-filter-hash.h       |  64 +++
 lib/trace-cmd/include/private/trace-hash.h    |  55 ++
 lib/trace-cmd/include/private/trace-msg.h     |  15 +
 lib/trace-cmd/include/trace-cmd-local.h       |   2 +
 lib/trace-cmd/trace-ftrace.c                  |   2 +-
 lib/trace-cmd/trace-hooks.c                   |   2 +-
 lib/trace-cmd/trace-recorder.c                |   2 +-
 lib/trace-cmd/trace-timesync.c                |   2 +-
 lib/trace-cmd/trace-util.c                    |   2 +-
 lib/traceevent/plugins/plugin_python_loader.c |   3 +-
 python/ctracecmd.i                            |   1 +
 tracecmd/include/trace-local.h                |   2 +-
 18 files changed, 637 insertions(+), 619 deletions(-)
 delete mode 100644 include/trace-cmd/trace-filter-hash.h
 delete mode 100644 include/trace-cmd/trace-hash.h
 delete mode 100644 include/trace-cmd/trace-msg.h
 create mode 100644 lib/trace-cmd/include/private/trace-cmd-private.h
 create mode 100644 lib/trace-cmd/include/private/trace-filter-hash.h
 create mode 100644 lib/trace-cmd/include/private/trace-hash.h
 create mode 100644 lib/trace-cmd/include/private/trace-msg.h

diff --git a/Makefile b/Makefile
index b034042..6ef6936 100644
--- a/Makefile
+++ b/Makefile
@@ -224,6 +224,7 @@ INCLUDES += -I$(src)/include/trace-cmd
 INCLUDES += -I$(src)/include/tracefs
 INCLUDES += -I$(src)/lib/traceevent/include
 INCLUDES += -I$(src)/lib/trace-cmd/include
+INCLUDES += -I$(src)/lib/trace-cmd/include/private
 INCLUDES += -I$(src)/lib/tracefs/include
 INCLUDES += -I$(src)/tracecmd/include
 INCLUDES += -I$(obj)/tracecmd/include
@@ -417,7 +418,6 @@ install_libs: libs
 	$(Q)$(call do_install,$(src)/include/traceevent/event-parse.h,$(includedir_SQ)/traceevent)
 	$(Q)$(call do_install,$(src)/include/traceevent/trace-seq.h,$(includedir_SQ)/traceevent)
 	$(Q)$(call do_install,$(src)/include/trace-cmd/trace-cmd.h,$(includedir_SQ)/trace-cmd)
-	$(Q)$(call do_install,$(src)/include/trace-cmd/trace-filter-hash.h,$(includedir_SQ)/trace-cmd)
 	$(Q)$(call do_install,$(src)/include/tracefs/tracefs.h,$(includedir_SQ)/tracefs)
 	$(Q)$(call do_install_ld,$(TRACE_LD_FILE),$(LD_SO_CONF_DIR),$(libdir_SQ)/trace-cmd)
 	$(Q)$(call do_install_ld,$(TRACE_LD_FILE),$(LD_SO_CONF_DIR),$(libdir_SQ)/traceevent)
diff --git a/include/trace-cmd/trace-cmd.h b/include/trace-cmd/trace-cmd.h
index 3c2b474..9751ac3 100644
--- a/include/trace-cmd/trace-cmd.h
+++ b/include/trace-cmd/trace-cmd.h
@@ -9,497 +9,31 @@
 #include "traceevent/event-parse.h"
 #include "tracefs/tracefs.h"
 
-#define TRACECMD_MAGIC { 23, 8, 68 }
-
-#define ARRAY_SIZE(_a) (sizeof(_a) / sizeof((_a)[0]))
-#define __weak __attribute__((weak))
-#define __noreturn __attribute__((noreturn))
-
-#define TRACECMD_ERR_MSK	((unsigned long)(-1) & ~((1UL << 14) - 1))
-#define TRACECMD_ISERR(ptr)	((unsigned long)(ptr) > TRACECMD_ERR_MSK)
-#define TRACECMD_ERROR(ret)	((void *)((unsigned long)(ret) | TRACECMD_ERR_MSK))
-#define TRACECMD_PTR2ERR(ptr)	((unisgned long)(ptr) & ~TRACECMD_ERR_MSK)
-
-void tracecmd_parse_cmdlines(struct tep_handle *pevent, char *file, int size);
-void tracecmd_parse_proc_kallsyms(struct tep_handle *pevent, char *file, unsigned int size);
-void tracecmd_parse_ftrace_printk(struct tep_handle *pevent, char *file, unsigned int size);
-struct tep_plugin_list *trace_load_plugins(struct tep_handle *tep);
-
-int *tracecmd_add_id(int *list, int id, int len);
-
-enum {
-	RINGBUF_TYPE_PADDING		= 29,
-	RINGBUF_TYPE_TIME_EXTEND	= 30,
-	RINGBUF_TYPE_TIME_STAMP		= 31,
-};
-
-void tracecmd_record_ref(struct tep_record *record);
-void free_record(struct tep_record *record);
-
-void tracecmd_set_debug(bool set_debug);
-bool tracecmd_get_debug(void);
-
 struct tracecmd_input;
-struct tracecmd_output;
-struct tracecmd_recorder;
-struct hook_list;
-
-/* --- tracecmd plugins --- */
-
-extern int tracecmd_disable_sys_plugins;
-extern int tracecmd_disable_plugins;
-
-enum tracecmd_context {
-	TRACECMD_INPUT,
-	TRACECMD_OUTPUT,
-};
-
-enum tracecmd_plugin_flag {
-	TRACECMD_DISABLE_SYS_PLUGINS	= 1,
-	TRACECMD_DISABLE_PLUGINS	= 1 << 1,
-};
-
-struct trace_plugin_context;
-
-struct trace_plugin_context *
-tracecmd_plugin_context_create(enum tracecmd_context context, void *data);
-
-void tracecmd_plugin_set_flag(struct trace_plugin_context *context,
-			      enum tracecmd_plugin_flag flag);
-
-#define TRACECMD_PLUGIN_LOADER tracecmd_plugin_loader
-#define TRACECMD_PLUGIN_UNLOADER tracecmd_plugin_unloader
-#define TRACECMD_PLUGIN_ALIAS tracecmd_plugin_alias
-#define _MAKE_STR(x)	#x
-#define MAKE_STR(x)	_MAKE_STR(x)
-#define TRACECMD_PLUGIN_LOADER_NAME MAKE_STR(TRACECMD_PLUGIN_LOADER)
-#define TRACECMD_PLUGIN_UNLOADER_NAME MAKE_STR(TRACECMD_PLUGIN_UNLOADER)
-#define TRACECMD_PLUGIN_ALIAS_NAME MAKE_STR(TRACECMD_PLUGIN_ALIAS)
-
-typedef int (*tracecmd_plugin_load_func)(struct trace_plugin_context *trace);
-typedef int (*tracecmd_plugin_unload_func)(struct trace_plugin_context *trace);
-
-struct tracecmd_input *
-tracecmd_plugin_context_input(struct trace_plugin_context *trace_context);
-struct tracecmd_output *
-tracecmd_plugin_context_output(struct trace_plugin_context *trace_context);
-
-void tracecmd_set_quiet(struct tracecmd_output *handle, bool set_quiet);
-bool tracecmd_get_quiet(struct tracecmd_output *handle);
-
-static inline int tracecmd_host_bigendian(void)
-{
-	unsigned char str[] = { 0x1, 0x2, 0x3, 0x4 };
-	unsigned int *ptr;
-
-	ptr = (unsigned int *)str;
-	return *ptr == 0x01020304;
-}
-
-/* --- Opening and Reading the trace.dat file --- */
-
-enum {
-	TRACECMD_OPTION_DONE,
-	TRACECMD_OPTION_DATE,
-	TRACECMD_OPTION_CPUSTAT,
-	TRACECMD_OPTION_BUFFER,
-	TRACECMD_OPTION_TRACECLOCK,
-	TRACECMD_OPTION_UNAME,
-	TRACECMD_OPTION_HOOK,
-	TRACECMD_OPTION_OFFSET,
-	TRACECMD_OPTION_CPUCOUNT,
-	TRACECMD_OPTION_VERSION,
-	TRACECMD_OPTION_PROCMAPS,
-	TRACECMD_OPTION_TRACEID,
-	TRACECMD_OPTION_TIME_SHIFT,
-	TRACECMD_OPTION_GUEST,
-};
-
-enum {
-	TRACECMD_FL_IGNORE_DATE		= (1 << 0),
-	TRACECMD_FL_BUFFER_INSTANCE	= (1 << 1),
-	TRACECMD_FL_LATENCY		= (1 << 2),
-	TRACECMD_FL_IN_USECS		= (1 << 3),
-	TRACECMD_FL_FLYRECORD		= (1 << 4),
-};
-
-struct tracecmd_ftrace {
-	struct tracecmd_input		*handle;
-	struct tep_event *fgraph_ret_event;
-	int fgraph_ret_id;
-	int long_size;
-};
-
-struct tracecmd_proc_addr_map {
-	unsigned long long	start;
-	unsigned long long	end;
-	char			*lib_name;
-};
-
-typedef void (*tracecmd_show_data_func)(struct tracecmd_input *handle,
-					struct tep_record *record);
-typedef void (*tracecmd_handle_init_func)(struct tracecmd_input *handle,
-					  struct hook_list *hook, int global);
 
-struct tracecmd_input *tracecmd_alloc(const char *file);
-struct tracecmd_input *tracecmd_alloc_fd(int fd);
-struct tracecmd_input *tracecmd_open(const char *file);
 struct tracecmd_input *tracecmd_open_head(const char *file);
-struct tracecmd_input *tracecmd_open_fd(int fd);
+void tracecmd_close(struct tracecmd_input *handle);
 int tracecmd_pair_peer(struct tracecmd_input *handle,
 		       struct tracecmd_input *peer);
-void tracecmd_unpair_peer(struct tracecmd_input *handle);
-void tracecmd_ref(struct tracecmd_input *handle);
-void tracecmd_close(struct tracecmd_input *handle);
-int tracecmd_read_headers(struct tracecmd_input *handle);
-int tracecmd_get_parsing_failures(struct tracecmd_input *handle);
-int tracecmd_long_size(struct tracecmd_input *handle);
-int tracecmd_page_size(struct tracecmd_input *handle);
-int tracecmd_cpus(struct tracecmd_input *handle);
-int tracecmd_copy_headers(struct tracecmd_input *handle, int fd);
-void tracecmd_set_flag(struct tracecmd_input *handle, int flag);
-void tracecmd_clear_flag(struct tracecmd_input *handle, int flag);
-unsigned long tracecmd_get_flags(struct tracecmd_input *handle);
-unsigned long long tracecmd_get_traceid(struct tracecmd_input *handle);
-int tracecmd_get_guest_cpumap(struct tracecmd_input *handle,
-			      unsigned long long trace_id,
-			      const char **name,
-			      int *vcpu_count, const int **cpu_pid);
-unsigned long long tracecmd_get_tsync_peer(struct tracecmd_input *handle);
-int tracecmd_enable_tsync(struct tracecmd_input *handle, bool enable);
-
-void tracecmd_parse_trace_clock(struct tracecmd_input *handle, char *file, int size);
-
-int tracecmd_make_pipe(struct tracecmd_input *handle, int cpu, int fd, int cpus);
-
-int tracecmd_buffer_instances(struct tracecmd_input *handle);
-const char *tracecmd_buffer_instance_name(struct tracecmd_input *handle, int indx);
-struct tracecmd_input *tracecmd_buffer_instance_handle(struct tracecmd_input *handle, int indx);
-int tracecmd_is_buffer_instance(struct tracecmd_input *handle);
-
-void tracecmd_set_ts_offset(struct tracecmd_input *handle, long long offset);
-void tracecmd_set_ts2secs(struct tracecmd_input *handle, unsigned long long hz);
-
-void tracecmd_print_events(struct tracecmd_input *handle, const char *regex);
-
-struct hook_list *tracecmd_hooks(struct tracecmd_input *handle);
 
 int tracecmd_init_data(struct tracecmd_input *handle);
-
-void tracecmd_print_stats(struct tracecmd_input *handle);
-void tracecmd_print_uname(struct tracecmd_input *handle);
-void tracecmd_print_version(struct tracecmd_input *handle);
-
 struct tep_record *
-tracecmd_peek_data(struct tracecmd_input *handle, int cpu);
-
-static inline struct tep_record *
-tracecmd_peek_data_ref(struct tracecmd_input *handle, int cpu)
-{
-	struct tep_record *rec = tracecmd_peek_data(handle, cpu);
-	if (rec)
-		rec->ref_count++;
-	return rec;
-}
-
+tracecmd_read_cpu_first(struct tracecmd_input *handle, int cpu);
 struct tep_record *
 tracecmd_read_data(struct tracecmd_input *handle, int cpu);
-
-struct tep_record *
-tracecmd_read_prev(struct tracecmd_input *handle, struct tep_record *record);
-
-struct tep_record *
-tracecmd_read_next_data(struct tracecmd_input *handle, int *rec_cpu);
-
-struct tep_record *
-tracecmd_peek_next_data(struct tracecmd_input *handle, int *rec_cpu);
-
 struct tep_record *
 tracecmd_read_at(struct tracecmd_input *handle, unsigned long long offset,
 		 int *cpu);
-struct tep_record *
-tracecmd_translate_data(struct tracecmd_input *handle,
-			void *ptr, int size);
-struct tep_record *
-tracecmd_read_cpu_first(struct tracecmd_input *handle, int cpu);
-struct tep_record *
-tracecmd_read_cpu_last(struct tracecmd_input *handle, int cpu);
-int tracecmd_refresh_record(struct tracecmd_input *handle,
-			    struct tep_record *record);
-
-int tracecmd_set_cpu_to_timestamp(struct tracecmd_input *handle,
-				  int cpu, unsigned long long ts);
-void
-tracecmd_set_all_cpus_to_timestamp(struct tracecmd_input *handle,
-				   unsigned long long time);
-
-int tracecmd_set_cursor(struct tracecmd_input *handle,
-			int cpu, unsigned long long offset);
-unsigned long long
-tracecmd_get_cursor(struct tracecmd_input *handle, int cpu);
+void free_record(struct tep_record *record);
 
-int tracecmd_ftrace_overrides(struct tracecmd_input *handle, struct tracecmd_ftrace *finfo);
 struct tep_handle *tracecmd_get_pevent(struct tracecmd_input *handle);
-bool tracecmd_get_use_trace_clock(struct tracecmd_input *handle);
-tracecmd_show_data_func
-tracecmd_get_show_data_func(struct tracecmd_input *handle);
-void tracecmd_set_show_data_func(struct tracecmd_input *handle,
-				 tracecmd_show_data_func func);
-
-int tracecmd_record_at_buffer_start(struct tracecmd_input *handle, struct tep_record *record);
-unsigned long long tracecmd_page_ts(struct tracecmd_input *handle,
-				    struct tep_record *record);
-unsigned int tracecmd_record_ts_delta(struct tracecmd_input *handle,
-				      struct tep_record *record);
-
-struct tracecmd_proc_addr_map *
-tracecmd_search_task_map(struct tracecmd_input *handle,
-			 int pid, unsigned long long addr);
-#ifndef SWIG
-/* hack for function graph work around */
-extern __thread struct tracecmd_input *tracecmd_curr_thread_handle;
-#endif
-
-
-/* --- Creating and Writing the trace.dat file --- */
-
-struct tracecmd_event_list {
-	struct tracecmd_event_list	*next;
-	const char			*glob;
-};
-
-struct tracecmd_option;
-struct tracecmd_msg_handle;
-
-struct tracecmd_output *tracecmd_create_file_latency(const char *output_file, int cpus);
-struct tracecmd_output *tracecmd_create_file(const char *output_file,
-					     int cpus, char * const *cpu_data_files);
-struct tracecmd_output *
-tracecmd_create_file_glob(const char *output_file,
-			  int cpus, char * const *cpu_data_files,
-			  struct tracecmd_event_list *event_globs);
-struct tracecmd_output *
-tracecmd_create_init_file_glob(const char *output_file,
-			       struct tracecmd_event_list *list);
-struct tracecmd_output *tracecmd_create_init_fd(int fd);
-struct tracecmd_output *
-tracecmd_create_init_fd_glob(int fd, struct tracecmd_event_list *list);
-struct tracecmd_output *
-tracecmd_create_init_fd_msg(struct tracecmd_msg_handle *msg_handle,
-			    struct tracecmd_event_list *list);
-struct tracecmd_output *tracecmd_create_init_file(const char *output_file);
-struct tracecmd_output *tracecmd_create_init_file_override(const char *output_file,
-							   const char *tracing_dir,
-							   const char *kallsyms);
-struct tracecmd_option *tracecmd_add_option(struct tracecmd_output *handle,
-					    unsigned short id, int size,
-					    const void *data);
-struct tracecmd_option *
-tracecmd_add_option_v(struct tracecmd_output *handle,
-		      unsigned short id, const struct iovec *vector, int count);
-
-struct tracecmd_option *tracecmd_add_buffer_option(struct tracecmd_output *handle,
-						   const char *name, int cpus);
-
-int tracecmd_write_cpus(struct tracecmd_output *handle, int cpus);
-int tracecmd_write_options(struct tracecmd_output *handle);
-int tracecmd_append_options(struct tracecmd_output *handle);
-int tracecmd_update_option(struct tracecmd_output *handle,
-			   struct tracecmd_option *option, int size,
-			   const void *data);
-void tracecmd_output_close(struct tracecmd_output *handle);
-void tracecmd_output_free(struct tracecmd_output *handle);
-struct tracecmd_output *tracecmd_copy(struct tracecmd_input *ihandle,
-				      const char *file);
-
-int tracecmd_write_cpu_data(struct tracecmd_output *handle,
-			    int cpus, char * const *cpu_data_files);
-int tracecmd_append_cpu_data(struct tracecmd_output *handle,
-			     int cpus, char * const *cpu_data_files);
-int tracecmd_append_buffer_cpu_data(struct tracecmd_output *handle,
-				    struct tracecmd_option *option,
-				    int cpus, char * const *cpu_data_files);
-
-struct tracecmd_output *tracecmd_get_output_handle_fd(int fd);
-
-/* --- Reading the Fly Recorder Trace --- */
-
-enum {
-	TRACECMD_RECORD_NOSPLICE	= (1 << 0),	/* Use read instead of splice */
-	TRACECMD_RECORD_SNAPSHOT	= (1 << 1),	/* Extract from snapshot */
-	TRACECMD_RECORD_BLOCK		= (1 << 2),	/* Block on splice write */
-	TRACECMD_RECORD_NOBRASS		= (1 << 3),	/* Splice directly without a brass pipe */
-};
-
-void tracecmd_free_recorder(struct tracecmd_recorder *recorder);
-struct tracecmd_recorder *tracecmd_create_recorder(const char *file, int cpu, unsigned flags);
-struct tracecmd_recorder *tracecmd_create_recorder_fd(int fd, int cpu, unsigned flags);
-struct tracecmd_recorder *tracecmd_create_recorder_virt(const char *file, int cpu, unsigned flags, int trace_fd);
-struct tracecmd_recorder *tracecmd_create_recorder_maxkb(const char *file, int cpu, unsigned flags, int maxkb);
-struct tracecmd_recorder *tracecmd_create_buffer_recorder_fd(int fd, int cpu, unsigned flags, const char *buffer);
-struct tracecmd_recorder *tracecmd_create_buffer_recorder(const char *file, int cpu, unsigned flags, const char *buffer);
-struct tracecmd_recorder *tracecmd_create_buffer_recorder_maxkb(const char *file, int cpu, unsigned flags, const char *buffer, int maxkb);
-
-int tracecmd_start_recording(struct tracecmd_recorder *recorder, unsigned long sleep);
-void tracecmd_stop_recording(struct tracecmd_recorder *recorder);
-long tracecmd_flush_recording(struct tracecmd_recorder *recorder);
-
-enum tracecmd_msg_flags {
-	TRACECMD_MSG_FL_USE_TCP		= 1 << 0,
-};
-
-/* for both client and server */
-struct tracecmd_msg_handle {
-	int			fd;
-	short			cpu_count;
-	short			version;	/* Current protocol version */
-	unsigned long		flags;
-	bool			done;
-};
-
-struct tracecmd_msg_handle *
-  tracecmd_msg_handle_alloc(int fd, unsigned long flags);
-
-/* Closes the socket and frees the handle */
-void tracecmd_msg_handle_close(struct tracecmd_msg_handle *msg_handle);
-
-/* for clients */
-int tracecmd_msg_send_init_data(struct tracecmd_msg_handle *msg_handle,
-				unsigned int **client_ports);
-int tracecmd_msg_data_send(struct tracecmd_msg_handle *msg_handle,
-			       const char *buf, int size);
-int tracecmd_msg_finish_sending_data(struct tracecmd_msg_handle *msg_handle);
-int tracecmd_msg_send_close_msg(struct tracecmd_msg_handle *msg_handle);
-int tracecmd_msg_send_close_resp_msg(struct tracecmd_msg_handle *msg_handle);
-int tracecmd_msg_wait_close(struct tracecmd_msg_handle *msg_handle);
-int tracecmd_msg_wait_close_resp(struct tracecmd_msg_handle *msg_handle);
-
-/* for server */
-int tracecmd_msg_initial_setting(struct tracecmd_msg_handle *msg_handle);
-int tracecmd_msg_send_port_array(struct tracecmd_msg_handle *msg_handle,
-				 unsigned *ports);
-int tracecmd_msg_read_data(struct tracecmd_msg_handle *msg_handle, int ofd);
-int tracecmd_msg_collect_data(struct tracecmd_msg_handle *msg_handle, int ofd);
-bool tracecmd_msg_done(struct tracecmd_msg_handle *msg_handle);
-void tracecmd_msg_set_done(struct tracecmd_msg_handle *msg_handle);
-
-int tracecmd_msg_send_trace_req(struct tracecmd_msg_handle *msg_handle,
-				int argc, char **argv, bool use_fifos,
-				unsigned long long trace_id,
-				char *tsync_protos,
-				int tsync_protos_size);
-int tracecmd_msg_recv_trace_req(struct tracecmd_msg_handle *msg_handle,
-				int *argc, char ***argv, bool *use_fifos,
-				unsigned long long *trace_id,
-				char **tsync_protos,
-				unsigned int *tsync_protos_size);
-
-int tracecmd_msg_send_trace_resp(struct tracecmd_msg_handle *msg_handle,
-				 int nr_cpus, int page_size,
-				 unsigned int *ports, bool use_fifos,
-				 unsigned long long trace_id,
-				 unsigned int tsync_proto,
-				 unsigned int tsync_port);
-int tracecmd_msg_recv_trace_resp(struct tracecmd_msg_handle *msg_handle,
-				 int *nr_cpus, int *page_size,
-				 unsigned int **ports, bool *use_fifos,
-				 unsigned long long *trace_id,
-				 unsigned int *tsync_proto,
-				 unsigned int *tsync_port);
-
-int tracecmd_msg_send_time_sync(struct tracecmd_msg_handle *msg_handle,
-				unsigned int sync_protocol,
-				unsigned int sync_msg_id,
-				unsigned int payload_size, char *payload);
-int tracecmd_msg_recv_time_sync(struct tracecmd_msg_handle *msg_handle,
-				unsigned int *sync_protocol,
-				unsigned int *sync_msg_id,
-				unsigned int *payload_size, char **payload);
-
-/* --- Timestamp synchronization --- */
-
-enum{
-	TRACECMD_TIME_SYNC_PROTO_NONE	= 0,
-};
-enum{
-	TRACECMD_TIME_SYNC_CMD_PROBE	= 1,
-	TRACECMD_TIME_SYNC_CMD_STOP	= 2,
-};
-
-#define TRACECMD_TIME_SYNC_PROTO_PTP_WEIGHT	10
-
-struct tracecmd_time_sync {
-	unsigned int			sync_proto;
-	int				loop_interval;
-	pthread_mutex_t			lock;
-	pthread_cond_t			cond;
-	char				*clock_str;
-	struct tracecmd_msg_handle	*msg_handle;
-	void				*context;
-};
-
-void tracecmd_tsync_init(void);
-int tracecmd_tsync_proto_getall(char **proto_mask, int *words);
-unsigned int tracecmd_tsync_proto_select(char *proto_mask, int words);
-bool tsync_proto_is_supported(unsigned int proto_id);
-void tracecmd_tsync_with_host(struct tracecmd_time_sync *tsync);
-void tracecmd_tsync_with_guest(struct tracecmd_time_sync *tsync);
-int tracecmd_tsync_get_offsets(struct tracecmd_time_sync *tsync,
-				int *count,
-				long long **ts, long long **offsets);
-void tracecmd_tsync_free(struct tracecmd_time_sync *tsync);
-
-/* --- Plugin handling --- */
-extern struct tep_plugin_option trace_ftrace_options[];
-
-char **trace_util_find_plugin_files(const char *suffix);
-void trace_util_free_plugin_files(char **files);
-
-/* Used for trace-cmd list */
-void tracecmd_ftrace_load_options(void);
-
-/* event hooks */
-
-struct hook_list {
-	struct hook_list	*next;
-	struct buffer_instance	*instance;
-	const char		*hook;
-	char			*str;
-	char			*start_system;
-	char			*start_event;
-	char			*start_match;
-	char			*end_system;
-	char			*end_event;
-	char			*end_match;
-	char			*pid;
-	int			migrate;
-	int			global;
-	int			stack;
-};
-
-struct hook_list *tracecmd_create_event_hook(const char *arg);
-void tracecmd_free_hooks(struct hook_list *hooks);
-
-void tracecmd_plog(const char *fmt, ...);
-void tracecmd_plog_error(const char *fmt, ...);
-int tracecmd_set_logfile(char *logfile);
-
-/* --- System --- */
-unsigned long long tracecmd_generate_traceid(void);
-int tracecmd_count_cpus(void);
-
-/* --- Hack! --- */
-int tracecmd_blk_hack(struct tracecmd_input *handle);
-
-/* --- Stack tracer functions --- */
-int tracecmd_stack_tracer_status(int *status);
-
-/* --- Debugging --- */
-struct kbuffer *tracecmd_record_kbuf(struct tracecmd_input *handle,
-				     struct tep_record *record);
-void *tracecmd_record_page(struct tracecmd_input *handle,
-			   struct tep_record *record);
-void *tracecmd_record_offset(struct tracecmd_input *handle,
-			     struct tep_record *record);
+unsigned long long tracecmd_get_traceid(struct tracecmd_input *handle);
+int tracecmd_get_guest_cpumap(struct tracecmd_input *handle,
+			      unsigned long long trace_id,
+			      const char **name,
+			      int *vcpu_count, const int **cpu_pid);
+int tracecmd_buffer_instances(struct tracecmd_input *handle);
+const char *tracecmd_buffer_instance_name(struct tracecmd_input *handle, int indx);
+struct tracecmd_input *tracecmd_buffer_instance_handle(struct tracecmd_input *handle, int indx);
 
 #endif /* _TRACE_CMD_H */
diff --git a/include/trace-cmd/trace-filter-hash.h b/include/trace-cmd/trace-filter-hash.h
deleted file mode 100644
index 4111c41..0000000
--- a/include/trace-cmd/trace-filter-hash.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/* SPDX-License-Identifier: LGPL-2.1 */
-/*
- * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
- * Copyright (C) 2018 VMware Inc, Steven Rostedt <rostedt@goodmis.org>
- *
- */
-#ifndef _TRACE_FILTER_HASH_H
-#define _TRACE_FILTER_HASH_H
-
-#include <stdint.h>
-
-struct tracecmd_filter_id_item {
-	struct tracecmd_filter_id_item	*next;
-	int				id;
-};
-
-struct tracecmd_filter_id {
-	struct tracecmd_filter_id_item **hash;
-	int				count;
-};
-
-/**
- * tracecmd_quick_hash - A quick (non secured) hash alogirthm
- * @val: The value to perform the hash on
- * @bits: The size in bits you need to return
- *
- * This is a quick hashing function adapted from Donald E. Knuth's 32
- * bit multiplicative hash.  See The Art of Computer Programming (TAOCP).
- * Multiplication by the Prime number, closest to the golden ratio of
- * 2^32.
- *
- * @bits is used to max the result for use cases that require
- * a power of 2 return value that is less than 32 bits. Any value
- * of @bits greater than 31 (or zero), will simply return the full hash on @val.
- */
-static inline uint32_t tracecmd_quick_hash(uint32_t val, unsigned int bits)
-{
-	val *= UINT32_C(2654435761);
-
-	if (!bits || bits > 31)
-		return val;
-
-	return val & ((1 << bits) - 1);
-}
-
-struct tracecmd_filter_id_item *
-  tracecmd_filter_id_find(struct tracecmd_filter_id *hash, int id);
-void tracecmd_filter_id_add(struct tracecmd_filter_id *hash, int id);
-void tracecmd_filter_id_remove(struct tracecmd_filter_id *hash, int id);
-void tracecmd_filter_id_clear(struct tracecmd_filter_id *hash);
-struct tracecmd_filter_id *tracecmd_filter_id_hash_alloc(void);
-void tracecmd_filter_id_hash_free(struct tracecmd_filter_id *hash);
-struct tracecmd_filter_id *
-  tracecmd_filter_id_hash_copy(struct tracecmd_filter_id *hash);
-int *tracecmd_filter_ids(struct tracecmd_filter_id *hash);
-int tracecmd_filter_id_compare(struct tracecmd_filter_id *hash1,
-			       struct tracecmd_filter_id *hash2);
-
-static inline int tracecmd_filter_task_count(struct tracecmd_filter_id *hash)
-{
-	return hash->count;
-}
-
-#endif /* _TRACE_FILTER_HASH_H */
diff --git a/include/trace-cmd/trace-hash.h b/include/trace-cmd/trace-hash.h
deleted file mode 100644
index aa92cdf..0000000
--- a/include/trace-cmd/trace-hash.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (C) 2014 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
- *
- */
-#ifndef _TRACE_HASH_H
-#define _TRACE_HASH_H
-
-struct trace_hash_item {
-	struct trace_hash_item	*next;
-	struct trace_hash_item	*prev;
-	unsigned long long	key;
-};
-
-struct trace_hash {
-	struct trace_hash_item	**buckets;
-	int			nr_buckets;
-	int			power;
-};
-
-int trace_hash_init(struct trace_hash *hash, int buckets);
-void trace_hash_free(struct trace_hash *hash);
-int trace_hash_add(struct trace_hash *hash, struct trace_hash_item *item);
-int trace_hash_empty(struct trace_hash *hash);
-
-static inline void trace_hash_del(struct trace_hash_item *item)
-{
-	struct trace_hash_item *prev = item->prev;
-
-	prev->next = item->next;
-	if (item->next)
-		item->next->prev = prev;
-}
-
-#define trace_hash_for_each_bucket(bucket, hash)			\
-	for (bucket = (hash)->buckets;					\
-	     (bucket) < (hash)->buckets + (hash)->nr_buckets; (bucket)++)
-
-#define trace_hash_for_each_item(item, bucket)				\
-	for ((item = *(bucket)); item; item = (item)->next)
-
-#define trace_hash_for_each_item_safe(item, n, bucket)		\
-	for ((item = *(bucket)), n = item ? item->next : NULL; item; \
-	     item = n, n = item ? (item)->next : NULL)
-
-#define trace_hash_while_item(item, bucket)	\
-	while ((item = *(bucket)))
-
-typedef int (*trace_hash_func)(struct trace_hash_item *item, void *data);
-
-struct trace_hash_item *
-trace_hash_find(struct trace_hash *hash, unsigned long long key,
-		trace_hash_func match, void *data);
-
-#endif /* _TRACE_HASH_H */
diff --git a/include/trace-cmd/trace-msg.h b/include/trace-cmd/trace-msg.h
deleted file mode 100644
index aab8a69..0000000
--- a/include/trace-cmd/trace-msg.h
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef _TRACE_MSG_H_
-#define _TRACE_MSG_H_
-
-#include <stdbool.h>
-
-#define UDP_MAX_PACKET	(65536 - 20)
-#define V3_MAGIC	"766679\0"
-#define V3_CPU		"-1V3"
-
-#define V1_PROTOCOL	1
-#define V3_PROTOCOL	3
-
-extern unsigned int page_size;
-
-#endif /* _TRACE_MSG_H_ */
diff --git a/lib/trace-cmd/include/private/trace-cmd-private.h b/lib/trace-cmd/include/private/trace-cmd-private.h
new file mode 100644
index 0000000..458760e
--- /dev/null
+++ b/lib/trace-cmd/include/private/trace-cmd-private.h
@@ -0,0 +1,480 @@
+/* SPDX-License-Identifier: LGPL-2.1 */
+/*
+ * Copyright (C) 2008, 2009, 2010 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
+ *
+ */
+#ifndef _TRACE_CMD_PRIVATE_H
+#define _TRACE_CMD_PRIVATE_H
+
+#include "traceevent/event-parse.h"
+#include "trace-cmd/trace-cmd.h"
+
+#define TRACECMD_MAGIC { 23, 8, 68 }
+
+#define ARRAY_SIZE(_a) (sizeof(_a) / sizeof((_a)[0]))
+#define __weak __attribute__((weak))
+#define __noreturn __attribute__((noreturn))
+
+#define TRACECMD_ERR_MSK	((unsigned long)(-1) & ~((1UL << 14) - 1))
+#define TRACECMD_ISERR(ptr)	((unsigned long)(ptr) > TRACECMD_ERR_MSK)
+#define TRACECMD_ERROR(ret)	((void *)((unsigned long)(ret) | TRACECMD_ERR_MSK))
+#define TRACECMD_PTR2ERR(ptr)	((unisgned long)(ptr) & ~TRACECMD_ERR_MSK)
+
+void tracecmd_parse_cmdlines(struct tep_handle *pevent, char *file, int size);
+void tracecmd_parse_proc_kallsyms(struct tep_handle *pevent, char *file, unsigned int size);
+void tracecmd_parse_ftrace_printk(struct tep_handle *pevent, char *file, unsigned int size);
+struct tep_plugin_list *trace_load_plugins(struct tep_handle *tep);
+
+int *tracecmd_add_id(int *list, int id, int len);
+
+enum {
+	RINGBUF_TYPE_PADDING		= 29,
+	RINGBUF_TYPE_TIME_EXTEND	= 30,
+	RINGBUF_TYPE_TIME_STAMP		= 31,
+};
+
+void tracecmd_record_ref(struct tep_record *record);
+
+void tracecmd_set_debug(bool set_debug);
+bool tracecmd_get_debug(void);
+
+struct tracecmd_output;
+struct tracecmd_recorder;
+struct hook_list;
+
+/* --- tracecmd plugins --- */
+
+extern int tracecmd_disable_sys_plugins;
+extern int tracecmd_disable_plugins;
+
+enum tracecmd_context {
+	TRACECMD_INPUT,
+	TRACECMD_OUTPUT,
+};
+
+enum tracecmd_plugin_flag {
+	TRACECMD_DISABLE_SYS_PLUGINS	= 1,
+	TRACECMD_DISABLE_PLUGINS	= 1 << 1,
+};
+
+struct trace_plugin_context;
+
+struct trace_plugin_context *
+tracecmd_plugin_context_create(enum tracecmd_context context, void *data);
+
+void tracecmd_plugin_set_flag(struct trace_plugin_context *context,
+			      enum tracecmd_plugin_flag flag);
+
+#define TRACECMD_PLUGIN_LOADER tracecmd_plugin_loader
+#define TRACECMD_PLUGIN_UNLOADER tracecmd_plugin_unloader
+#define TRACECMD_PLUGIN_ALIAS tracecmd_plugin_alias
+#define _MAKE_STR(x)	#x
+#define MAKE_STR(x)	_MAKE_STR(x)
+#define TRACECMD_PLUGIN_LOADER_NAME MAKE_STR(TRACECMD_PLUGIN_LOADER)
+#define TRACECMD_PLUGIN_UNLOADER_NAME MAKE_STR(TRACECMD_PLUGIN_UNLOADER)
+#define TRACECMD_PLUGIN_ALIAS_NAME MAKE_STR(TRACECMD_PLUGIN_ALIAS)
+
+typedef int (*tracecmd_plugin_load_func)(struct trace_plugin_context *trace);
+typedef int (*tracecmd_plugin_unload_func)(struct trace_plugin_context *trace);
+
+struct tracecmd_input *
+tracecmd_plugin_context_input(struct trace_plugin_context *trace_context);
+struct tracecmd_output *
+tracecmd_plugin_context_output(struct trace_plugin_context *trace_context);
+
+void tracecmd_set_quiet(struct tracecmd_output *handle, bool set_quiet);
+bool tracecmd_get_quiet(struct tracecmd_output *handle);
+
+static inline int tracecmd_host_bigendian(void)
+{
+	unsigned char str[] = { 0x1, 0x2, 0x3, 0x4 };
+	unsigned int *ptr;
+
+	ptr = (unsigned int *)str;
+	return *ptr == 0x01020304;
+}
+
+/* --- Opening and Reading the trace.dat file --- */
+
+enum {
+	TRACECMD_OPTION_DONE,
+	TRACECMD_OPTION_DATE,
+	TRACECMD_OPTION_CPUSTAT,
+	TRACECMD_OPTION_BUFFER,
+	TRACECMD_OPTION_TRACECLOCK,
+	TRACECMD_OPTION_UNAME,
+	TRACECMD_OPTION_HOOK,
+	TRACECMD_OPTION_OFFSET,
+	TRACECMD_OPTION_CPUCOUNT,
+	TRACECMD_OPTION_VERSION,
+	TRACECMD_OPTION_PROCMAPS,
+	TRACECMD_OPTION_TRACEID,
+	TRACECMD_OPTION_TIME_SHIFT,
+	TRACECMD_OPTION_GUEST,
+};
+
+enum {
+	TRACECMD_FL_IGNORE_DATE		= (1 << 0),
+	TRACECMD_FL_BUFFER_INSTANCE	= (1 << 1),
+	TRACECMD_FL_LATENCY		= (1 << 2),
+	TRACECMD_FL_IN_USECS		= (1 << 3),
+	TRACECMD_FL_FLYRECORD		= (1 << 4),
+};
+
+struct tracecmd_ftrace {
+	struct tracecmd_input		*handle;
+	struct tep_event *fgraph_ret_event;
+	int fgraph_ret_id;
+	int long_size;
+};
+
+struct tracecmd_proc_addr_map {
+	unsigned long long	start;
+	unsigned long long	end;
+	char			*lib_name;
+};
+
+typedef void (*tracecmd_show_data_func)(struct tracecmd_input *handle,
+					struct tep_record *record);
+typedef void (*tracecmd_handle_init_func)(struct tracecmd_input *handle,
+					  struct hook_list *hook, int global);
+
+struct tracecmd_input *tracecmd_alloc(const char *file);
+struct tracecmd_input *tracecmd_alloc_fd(int fd);
+struct tracecmd_input *tracecmd_open(const char *file);
+struct tracecmd_input *tracecmd_open_fd(int fd);
+void tracecmd_unpair_peer(struct tracecmd_input *handle);
+void tracecmd_ref(struct tracecmd_input *handle);
+int tracecmd_read_headers(struct tracecmd_input *handle);
+int tracecmd_get_parsing_failures(struct tracecmd_input *handle);
+int tracecmd_long_size(struct tracecmd_input *handle);
+int tracecmd_page_size(struct tracecmd_input *handle);
+int tracecmd_cpus(struct tracecmd_input *handle);
+int tracecmd_copy_headers(struct tracecmd_input *handle, int fd);
+void tracecmd_set_flag(struct tracecmd_input *handle, int flag);
+void tracecmd_clear_flag(struct tracecmd_input *handle, int flag);
+unsigned long tracecmd_get_flags(struct tracecmd_input *handle);
+unsigned long long tracecmd_get_tsync_peer(struct tracecmd_input *handle);
+int tracecmd_enable_tsync(struct tracecmd_input *handle, bool enable);
+
+void tracecmd_parse_trace_clock(struct tracecmd_input *handle, char *file, int size);
+
+int tracecmd_make_pipe(struct tracecmd_input *handle, int cpu, int fd, int cpus);
+
+int tracecmd_is_buffer_instance(struct tracecmd_input *handle);
+
+void tracecmd_set_ts_offset(struct tracecmd_input *handle, long long offset);
+void tracecmd_set_ts2secs(struct tracecmd_input *handle, unsigned long long hz);
+
+void tracecmd_print_events(struct tracecmd_input *handle, const char *regex);
+
+struct hook_list *tracecmd_hooks(struct tracecmd_input *handle);
+
+void tracecmd_print_stats(struct tracecmd_input *handle);
+void tracecmd_print_uname(struct tracecmd_input *handle);
+void tracecmd_print_version(struct tracecmd_input *handle);
+
+struct tep_record *
+tracecmd_peek_data(struct tracecmd_input *handle, int cpu);
+
+static inline struct tep_record *
+tracecmd_peek_data_ref(struct tracecmd_input *handle, int cpu)
+{
+	struct tep_record *rec = tracecmd_peek_data(handle, cpu);
+	if (rec)
+		rec->ref_count++;
+	return rec;
+}
+
+struct tep_record *
+tracecmd_read_prev(struct tracecmd_input *handle, struct tep_record *record);
+
+struct tep_record *
+tracecmd_read_next_data(struct tracecmd_input *handle, int *rec_cpu);
+
+struct tep_record *
+tracecmd_peek_next_data(struct tracecmd_input *handle, int *rec_cpu);
+
+struct tep_record *
+tracecmd_translate_data(struct tracecmd_input *handle,
+			void *ptr, int size);
+struct tep_record *
+tracecmd_read_cpu_last(struct tracecmd_input *handle, int cpu);
+int tracecmd_refresh_record(struct tracecmd_input *handle,
+			    struct tep_record *record);
+
+int tracecmd_set_cpu_to_timestamp(struct tracecmd_input *handle,
+				  int cpu, unsigned long long ts);
+void
+tracecmd_set_all_cpus_to_timestamp(struct tracecmd_input *handle,
+				   unsigned long long time);
+
+int tracecmd_set_cursor(struct tracecmd_input *handle,
+			int cpu, unsigned long long offset);
+unsigned long long
+tracecmd_get_cursor(struct tracecmd_input *handle, int cpu);
+
+int tracecmd_ftrace_overrides(struct tracecmd_input *handle, struct tracecmd_ftrace *finfo);
+bool tracecmd_get_use_trace_clock(struct tracecmd_input *handle);
+tracecmd_show_data_func
+tracecmd_get_show_data_func(struct tracecmd_input *handle);
+void tracecmd_set_show_data_func(struct tracecmd_input *handle,
+				 tracecmd_show_data_func func);
+
+int tracecmd_record_at_buffer_start(struct tracecmd_input *handle, struct tep_record *record);
+unsigned long long tracecmd_page_ts(struct tracecmd_input *handle,
+				    struct tep_record *record);
+unsigned int tracecmd_record_ts_delta(struct tracecmd_input *handle,
+				      struct tep_record *record);
+
+struct tracecmd_proc_addr_map *
+tracecmd_search_task_map(struct tracecmd_input *handle,
+			 int pid, unsigned long long addr);
+#ifndef SWIG
+/* hack for function graph work around */
+extern __thread struct tracecmd_input *tracecmd_curr_thread_handle;
+#endif
+
+
+/* --- Creating and Writing the trace.dat file --- */
+
+struct tracecmd_event_list {
+	struct tracecmd_event_list	*next;
+	const char			*glob;
+};
+
+struct tracecmd_option;
+struct tracecmd_msg_handle;
+
+struct tracecmd_output *tracecmd_create_file_latency(const char *output_file, int cpus);
+struct tracecmd_output *tracecmd_create_file(const char *output_file,
+					     int cpus, char * const *cpu_data_files);
+struct tracecmd_output *
+tracecmd_create_file_glob(const char *output_file,
+			  int cpus, char * const *cpu_data_files,
+			  struct tracecmd_event_list *event_globs);
+struct tracecmd_output *
+tracecmd_create_init_file_glob(const char *output_file,
+			       struct tracecmd_event_list *list);
+struct tracecmd_output *tracecmd_create_init_fd(int fd);
+struct tracecmd_output *
+tracecmd_create_init_fd_glob(int fd, struct tracecmd_event_list *list);
+struct tracecmd_output *
+tracecmd_create_init_fd_msg(struct tracecmd_msg_handle *msg_handle,
+			    struct tracecmd_event_list *list);
+struct tracecmd_output *tracecmd_create_init_file(const char *output_file);
+struct tracecmd_output *tracecmd_create_init_file_override(const char *output_file,
+							   const char *tracing_dir,
+							   const char *kallsyms);
+struct tracecmd_option *tracecmd_add_option(struct tracecmd_output *handle,
+					    unsigned short id, int size,
+					    const void *data);
+struct tracecmd_option *
+tracecmd_add_option_v(struct tracecmd_output *handle,
+		      unsigned short id, const struct iovec *vector, int count);
+
+struct tracecmd_option *tracecmd_add_buffer_option(struct tracecmd_output *handle,
+						   const char *name, int cpus);
+
+int tracecmd_write_cpus(struct tracecmd_output *handle, int cpus);
+int tracecmd_write_options(struct tracecmd_output *handle);
+int tracecmd_append_options(struct tracecmd_output *handle);
+int tracecmd_update_option(struct tracecmd_output *handle,
+			   struct tracecmd_option *option, int size,
+			   const void *data);
+void tracecmd_output_close(struct tracecmd_output *handle);
+void tracecmd_output_free(struct tracecmd_output *handle);
+struct tracecmd_output *tracecmd_copy(struct tracecmd_input *ihandle,
+				      const char *file);
+
+int tracecmd_write_cpu_data(struct tracecmd_output *handle,
+			    int cpus, char * const *cpu_data_files);
+int tracecmd_append_cpu_data(struct tracecmd_output *handle,
+			     int cpus, char * const *cpu_data_files);
+int tracecmd_append_buffer_cpu_data(struct tracecmd_output *handle,
+				    struct tracecmd_option *option,
+				    int cpus, char * const *cpu_data_files);
+
+struct tracecmd_output *tracecmd_get_output_handle_fd(int fd);
+
+/* --- Reading the Fly Recorder Trace --- */
+
+enum {
+	TRACECMD_RECORD_NOSPLICE	= (1 << 0),	/* Use read instead of splice */
+	TRACECMD_RECORD_SNAPSHOT	= (1 << 1),	/* Extract from snapshot */
+	TRACECMD_RECORD_BLOCK		= (1 << 2),	/* Block on splice write */
+	TRACECMD_RECORD_NOBRASS		= (1 << 3),	/* Splice directly without a brass pipe */
+};
+
+void tracecmd_free_recorder(struct tracecmd_recorder *recorder);
+struct tracecmd_recorder *tracecmd_create_recorder(const char *file, int cpu, unsigned flags);
+struct tracecmd_recorder *tracecmd_create_recorder_fd(int fd, int cpu, unsigned flags);
+struct tracecmd_recorder *tracecmd_create_recorder_virt(const char *file, int cpu, unsigned flags, int trace_fd);
+struct tracecmd_recorder *tracecmd_create_recorder_maxkb(const char *file, int cpu, unsigned flags, int maxkb);
+struct tracecmd_recorder *tracecmd_create_buffer_recorder_fd(int fd, int cpu, unsigned flags, const char *buffer);
+struct tracecmd_recorder *tracecmd_create_buffer_recorder(const char *file, int cpu, unsigned flags, const char *buffer);
+struct tracecmd_recorder *tracecmd_create_buffer_recorder_maxkb(const char *file, int cpu, unsigned flags, const char *buffer, int maxkb);
+
+int tracecmd_start_recording(struct tracecmd_recorder *recorder, unsigned long sleep);
+void tracecmd_stop_recording(struct tracecmd_recorder *recorder);
+long tracecmd_flush_recording(struct tracecmd_recorder *recorder);
+
+enum tracecmd_msg_flags {
+	TRACECMD_MSG_FL_USE_TCP		= 1 << 0,
+};
+
+/* for both client and server */
+struct tracecmd_msg_handle {
+	int			fd;
+	short			cpu_count;
+	short			version;	/* Current protocol version */
+	unsigned long		flags;
+	bool			done;
+};
+
+struct tracecmd_msg_handle *
+tracecmd_msg_handle_alloc(int fd, unsigned long flags);
+
+/* Closes the socket and frees the handle */
+void tracecmd_msg_handle_close(struct tracecmd_msg_handle *msg_handle);
+
+/* for clients */
+int tracecmd_msg_send_init_data(struct tracecmd_msg_handle *msg_handle,
+				unsigned int **client_ports);
+int tracecmd_msg_data_send(struct tracecmd_msg_handle *msg_handle,
+			       const char *buf, int size);
+int tracecmd_msg_finish_sending_data(struct tracecmd_msg_handle *msg_handle);
+int tracecmd_msg_send_close_msg(struct tracecmd_msg_handle *msg_handle);
+int tracecmd_msg_send_close_resp_msg(struct tracecmd_msg_handle *msg_handle);
+int tracecmd_msg_wait_close(struct tracecmd_msg_handle *msg_handle);
+int tracecmd_msg_wait_close_resp(struct tracecmd_msg_handle *msg_handle);
+
+/* for server */
+int tracecmd_msg_initial_setting(struct tracecmd_msg_handle *msg_handle);
+int tracecmd_msg_send_port_array(struct tracecmd_msg_handle *msg_handle,
+				 unsigned *ports);
+int tracecmd_msg_read_data(struct tracecmd_msg_handle *msg_handle, int ofd);
+int tracecmd_msg_collect_data(struct tracecmd_msg_handle *msg_handle, int ofd);
+bool tracecmd_msg_done(struct tracecmd_msg_handle *msg_handle);
+void tracecmd_msg_set_done(struct tracecmd_msg_handle *msg_handle);
+
+int tracecmd_msg_send_trace_req(struct tracecmd_msg_handle *msg_handle,
+				int argc, char **argv, bool use_fifos,
+				unsigned long long trace_id,
+				char *tsync_protos,
+				int tsync_protos_size);
+int tracecmd_msg_recv_trace_req(struct tracecmd_msg_handle *msg_handle,
+				int *argc, char ***argv, bool *use_fifos,
+				unsigned long long *trace_id,
+				char **tsync_protos,
+				unsigned int *tsync_protos_size);
+
+int tracecmd_msg_send_trace_resp(struct tracecmd_msg_handle *msg_handle,
+				 int nr_cpus, int page_size,
+				 unsigned int *ports, bool use_fifos,
+				 unsigned long long trace_id,
+				 unsigned int tsync_proto,
+				 unsigned int tsync_port);
+int tracecmd_msg_recv_trace_resp(struct tracecmd_msg_handle *msg_handle,
+				 int *nr_cpus, int *page_size,
+				 unsigned int **ports, bool *use_fifos,
+				 unsigned long long *trace_id,
+				 unsigned int *tsync_proto,
+				 unsigned int *tsync_port);
+
+int tracecmd_msg_send_time_sync(struct tracecmd_msg_handle *msg_handle,
+				unsigned int sync_protocol,
+				unsigned int sync_msg_id,
+				unsigned int payload_size, char *payload);
+int tracecmd_msg_recv_time_sync(struct tracecmd_msg_handle *msg_handle,
+				unsigned int *sync_protocol,
+				unsigned int *sync_msg_id,
+				unsigned int *payload_size, char **payload);
+
+/* --- Timestamp synchronization --- */
+
+enum{
+	TRACECMD_TIME_SYNC_PROTO_NONE	= 0,
+};
+enum{
+	TRACECMD_TIME_SYNC_CMD_PROBE	= 1,
+	TRACECMD_TIME_SYNC_CMD_STOP	= 2,
+};
+
+#define TRACECMD_TIME_SYNC_PROTO_PTP_WEIGHT	10
+
+struct tracecmd_time_sync {
+	unsigned int			sync_proto;
+	int				loop_interval;
+	pthread_mutex_t			lock;
+	pthread_cond_t			cond;
+	char				*clock_str;
+	struct tracecmd_msg_handle	*msg_handle;
+	void				*context;
+};
+
+void tracecmd_tsync_init(void);
+int tracecmd_tsync_proto_getall(char **proto_mask, int *words);
+unsigned int tracecmd_tsync_proto_select(char *proto_mask, int words);
+bool tsync_proto_is_supported(unsigned int proto_id);
+void tracecmd_tsync_with_host(struct tracecmd_time_sync *tsync);
+void tracecmd_tsync_with_guest(struct tracecmd_time_sync *tsync);
+int tracecmd_tsync_get_offsets(struct tracecmd_time_sync *tsync,
+				int *count,
+				long long **ts, long long **offsets);
+void tracecmd_tsync_free(struct tracecmd_time_sync *tsync);
+
+/* --- Plugin handling --- */
+extern struct tep_plugin_option trace_ftrace_options[];
+
+char **trace_util_find_plugin_files(const char *suffix);
+void trace_util_free_plugin_files(char **files);
+
+/* Used for trace-cmd list */
+void tracecmd_ftrace_load_options(void);
+
+/* event hooks */
+
+struct hook_list {
+	struct hook_list	*next;
+	struct buffer_instance	*instance;
+	const char		*hook;
+	char			*str;
+	char			*start_system;
+	char			*start_event;
+	char			*start_match;
+	char			*end_system;
+	char			*end_event;
+	char			*end_match;
+	char			*pid;
+	int			migrate;
+	int			global;
+	int			stack;
+};
+
+struct hook_list *tracecmd_create_event_hook(const char *arg);
+void tracecmd_free_hooks(struct hook_list *hooks);
+
+void tracecmd_plog(const char *fmt, ...);
+void tracecmd_plog_error(const char *fmt, ...);
+int tracecmd_set_logfile(char *logfile);
+
+/* --- System --- */
+unsigned long long tracecmd_generate_traceid(void);
+int tracecmd_count_cpus(void);
+
+/* --- Hack! --- */
+int tracecmd_blk_hack(struct tracecmd_input *handle);
+
+/* --- Stack tracer functions --- */
+int tracecmd_stack_tracer_status(int *status);
+
+/* --- Debugging --- */
+struct kbuffer *tracecmd_record_kbuf(struct tracecmd_input *handle,
+				     struct tep_record *record);
+void *tracecmd_record_page(struct tracecmd_input *handle,
+			   struct tep_record *record);
+void *tracecmd_record_offset(struct tracecmd_input *handle,
+			     struct tep_record *record);
+
+#endif /* _TRACE_CMD_PRIVATE_H */
diff --git a/lib/trace-cmd/include/private/trace-filter-hash.h b/lib/trace-cmd/include/private/trace-filter-hash.h
new file mode 100644
index 0000000..4111c41
--- /dev/null
+++ b/lib/trace-cmd/include/private/trace-filter-hash.h
@@ -0,0 +1,64 @@
+/* SPDX-License-Identifier: LGPL-2.1 */
+/*
+ * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
+ * Copyright (C) 2018 VMware Inc, Steven Rostedt <rostedt@goodmis.org>
+ *
+ */
+#ifndef _TRACE_FILTER_HASH_H
+#define _TRACE_FILTER_HASH_H
+
+#include <stdint.h>
+
+struct tracecmd_filter_id_item {
+	struct tracecmd_filter_id_item	*next;
+	int				id;
+};
+
+struct tracecmd_filter_id {
+	struct tracecmd_filter_id_item **hash;
+	int				count;
+};
+
+/**
+ * tracecmd_quick_hash - A quick (non secured) hash alogirthm
+ * @val: The value to perform the hash on
+ * @bits: The size in bits you need to return
+ *
+ * This is a quick hashing function adapted from Donald E. Knuth's 32
+ * bit multiplicative hash.  See The Art of Computer Programming (TAOCP).
+ * Multiplication by the Prime number, closest to the golden ratio of
+ * 2^32.
+ *
+ * @bits is used to max the result for use cases that require
+ * a power of 2 return value that is less than 32 bits. Any value
+ * of @bits greater than 31 (or zero), will simply return the full hash on @val.
+ */
+static inline uint32_t tracecmd_quick_hash(uint32_t val, unsigned int bits)
+{
+	val *= UINT32_C(2654435761);
+
+	if (!bits || bits > 31)
+		return val;
+
+	return val & ((1 << bits) - 1);
+}
+
+struct tracecmd_filter_id_item *
+  tracecmd_filter_id_find(struct tracecmd_filter_id *hash, int id);
+void tracecmd_filter_id_add(struct tracecmd_filter_id *hash, int id);
+void tracecmd_filter_id_remove(struct tracecmd_filter_id *hash, int id);
+void tracecmd_filter_id_clear(struct tracecmd_filter_id *hash);
+struct tracecmd_filter_id *tracecmd_filter_id_hash_alloc(void);
+void tracecmd_filter_id_hash_free(struct tracecmd_filter_id *hash);
+struct tracecmd_filter_id *
+  tracecmd_filter_id_hash_copy(struct tracecmd_filter_id *hash);
+int *tracecmd_filter_ids(struct tracecmd_filter_id *hash);
+int tracecmd_filter_id_compare(struct tracecmd_filter_id *hash1,
+			       struct tracecmd_filter_id *hash2);
+
+static inline int tracecmd_filter_task_count(struct tracecmd_filter_id *hash)
+{
+	return hash->count;
+}
+
+#endif /* _TRACE_FILTER_HASH_H */
diff --git a/lib/trace-cmd/include/private/trace-hash.h b/lib/trace-cmd/include/private/trace-hash.h
new file mode 100644
index 0000000..aa92cdf
--- /dev/null
+++ b/lib/trace-cmd/include/private/trace-hash.h
@@ -0,0 +1,55 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2014 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
+ *
+ */
+#ifndef _TRACE_HASH_H
+#define _TRACE_HASH_H
+
+struct trace_hash_item {
+	struct trace_hash_item	*next;
+	struct trace_hash_item	*prev;
+	unsigned long long	key;
+};
+
+struct trace_hash {
+	struct trace_hash_item	**buckets;
+	int			nr_buckets;
+	int			power;
+};
+
+int trace_hash_init(struct trace_hash *hash, int buckets);
+void trace_hash_free(struct trace_hash *hash);
+int trace_hash_add(struct trace_hash *hash, struct trace_hash_item *item);
+int trace_hash_empty(struct trace_hash *hash);
+
+static inline void trace_hash_del(struct trace_hash_item *item)
+{
+	struct trace_hash_item *prev = item->prev;
+
+	prev->next = item->next;
+	if (item->next)
+		item->next->prev = prev;
+}
+
+#define trace_hash_for_each_bucket(bucket, hash)			\
+	for (bucket = (hash)->buckets;					\
+	     (bucket) < (hash)->buckets + (hash)->nr_buckets; (bucket)++)
+
+#define trace_hash_for_each_item(item, bucket)				\
+	for ((item = *(bucket)); item; item = (item)->next)
+
+#define trace_hash_for_each_item_safe(item, n, bucket)		\
+	for ((item = *(bucket)), n = item ? item->next : NULL; item; \
+	     item = n, n = item ? (item)->next : NULL)
+
+#define trace_hash_while_item(item, bucket)	\
+	while ((item = *(bucket)))
+
+typedef int (*trace_hash_func)(struct trace_hash_item *item, void *data);
+
+struct trace_hash_item *
+trace_hash_find(struct trace_hash *hash, unsigned long long key,
+		trace_hash_func match, void *data);
+
+#endif /* _TRACE_HASH_H */
diff --git a/lib/trace-cmd/include/private/trace-msg.h b/lib/trace-cmd/include/private/trace-msg.h
new file mode 100644
index 0000000..aab8a69
--- /dev/null
+++ b/lib/trace-cmd/include/private/trace-msg.h
@@ -0,0 +1,15 @@
+#ifndef _TRACE_MSG_H_
+#define _TRACE_MSG_H_
+
+#include <stdbool.h>
+
+#define UDP_MAX_PACKET	(65536 - 20)
+#define V3_MAGIC	"766679\0"
+#define V3_CPU		"-1V3"
+
+#define V1_PROTOCOL	1
+#define V3_PROTOCOL	3
+
+extern unsigned int page_size;
+
+#endif /* _TRACE_MSG_H_ */
diff --git a/lib/trace-cmd/include/trace-cmd-local.h b/lib/trace-cmd/include/trace-cmd-local.h
index 95dce66..d0a7365 100644
--- a/lib/trace-cmd/include/trace-cmd-local.h
+++ b/lib/trace-cmd/include/trace-cmd-local.h
@@ -6,6 +6,8 @@
 #ifndef _TRACE_CMD_LOCAL_H
 #define _TRACE_CMD_LOCAL_H
 
+#include "trace-cmd-private.h"
+
 /* Can be overridden */
 void warning(const char *fmt, ...);
 
diff --git a/lib/trace-cmd/trace-ftrace.c b/lib/trace-cmd/trace-ftrace.c
index 20bf71f..df7335f 100644
--- a/lib/trace-cmd/trace-ftrace.c
+++ b/lib/trace-cmd/trace-ftrace.c
@@ -8,7 +8,7 @@
 #include <string.h>
 #include <sys/param.h>
 
-#include "trace-cmd.h"
+#include "trace-cmd-private.h"
 
 struct tep_plugin_option trace_ftrace_options[] = {
 	{
diff --git a/lib/trace-cmd/trace-hooks.c b/lib/trace-cmd/trace-hooks.c
index 8c969a6..2dadf61 100644
--- a/lib/trace-cmd/trace-hooks.c
+++ b/lib/trace-cmd/trace-hooks.c
@@ -8,7 +8,7 @@
 #include <stdlib.h>
 #include <ctype.h>
 
-#include "trace-cmd.h"
+#include "trace-cmd-private.h"
 #include "event-utils.h"
 
 struct hook_list *tracecmd_create_event_hook(const char *arg)
diff --git a/lib/trace-cmd/trace-recorder.c b/lib/trace-cmd/trace-recorder.c
index 2a6e2b6..6b647d6 100644
--- a/lib/trace-cmd/trace-recorder.c
+++ b/lib/trace-cmd/trace-recorder.c
@@ -13,7 +13,7 @@
 #include <errno.h>
 
 #include "tracefs.h"
-#include "trace-cmd.h"
+#include "trace-cmd-private.h"
 #include "event-utils.h"
 
 /* F_GETPIPE_SZ was introduced in 2.6.35, older systems don't have it */
diff --git a/lib/trace-cmd/trace-timesync.c b/lib/trace-cmd/trace-timesync.c
index 7a6a7eb..390e9d9 100644
--- a/lib/trace-cmd/trace-timesync.c
+++ b/lib/trace-cmd/trace-timesync.c
@@ -17,7 +17,7 @@
 #include <errno.h>
 #include <pthread.h>
 
-#include "trace-cmd.h"
+#include "trace-cmd-private.h"
 #include "tracefs.h"
 #include "event-utils.h"
 #include "trace-tsync-local.h"
diff --git a/lib/trace-cmd/trace-util.c b/lib/trace-cmd/trace-util.c
index 0ead96e..6b5d872 100644
--- a/lib/trace-cmd/trace-util.c
+++ b/lib/trace-cmd/trace-util.c
@@ -21,7 +21,7 @@
 #include <sys/sysinfo.h>
 #include <time.h>
 
-#include "trace-cmd.h"
+#include "trace-cmd-private.h"
 #include "event-utils.h"
 
 #define LOCAL_PLUGIN_DIR ".trace-cmd/plugins"
diff --git a/lib/traceevent/plugins/plugin_python_loader.c b/lib/traceevent/plugins/plugin_python_loader.c
index 776bf12..01bdfad 100644
--- a/lib/traceevent/plugins/plugin_python_loader.c
+++ b/lib/traceevent/plugins/plugin_python_loader.c
@@ -1,6 +1,7 @@
 #include <Python.h>
 #include <stdio.h>
-#include "trace-cmd.h"
+#include "event-parse.h"
+#include "trace-cmd-private.h"
 
 #ifndef PYTHON_DIR
 #define PYTHON_DIR "."
diff --git a/python/ctracecmd.i b/python/ctracecmd.i
index 01cd0d5..5f7181c 100644
--- a/python/ctracecmd.i
+++ b/python/ctracecmd.i
@@ -15,6 +15,7 @@
 
 %{
 #include "trace-cmd.h"
+#include "event-parse.h"
 #include "event-utils.h"
 #include <Python.h>
 %}
diff --git a/tracecmd/include/trace-local.h b/tracecmd/include/trace-local.h
index 207aa68..28d1b4e 100644
--- a/tracecmd/include/trace-local.h
+++ b/tracecmd/include/trace-local.h
@@ -9,7 +9,7 @@
 #include <sys/types.h>
 #include <dirent.h>	/* for DIR */
 
-#include "trace-cmd.h"
+#include "trace-cmd-private.h"
 #include "event-utils.h"
 
 #define TRACE_AGENT_DEFAULT_PORT	823
-- 
2.29.2

